# 敌人基础单位类，继承自Unit基类
# 实现了基础的生命值、伤害计算、防御系统和效果系统
extends Unit
class_name EnemyBaseUnit


#region 属性配置
# 生命值相关属性
var max_hp: float = 1000.0 # 最大生命值
var hp: float = max_hp: # 当前生命值
	set(value):
		hp = clamp(value, 0, max_hp) # 确保生命值在0到最大值之间
		if hp <= 0:
			_on_death() # 生命值降到0时触发死亡事件

# 基础战斗属性
var base_attack: float = 0.0 # 基础攻击力
var defense_value: float = 0.0 # 护甲值（用于数值减伤计算）
var defense_percent_base: float = 100.0 # 护甲减伤计算的基准值

# 元素抗性系统
# 不同元素类型的抗性值（0-100表示减伤百分比）
var resistances: Dictionary = {
	GameConstant.DAMAGE_TYPE.FIRE: 0.0, # 火属性抗性
	GameConstant.DAMAGE_TYPE.LIGHTNING: 0.0, # 雷属性抗性
	GameConstant.DAMAGE_TYPE.ICE: 0.0 # 冰属性抗性
}
#endregion


# 初始化函数
func _ready():
	hp = max_hp # 设置初始生命值
	super() # 调用父类初始化
	
#region 伤害处理系统
func deal_damage(skill: Skill):
	"""
	处理造成伤害的全流程
	参数:
		skill: 使用的技能实例
	"""
	# 计算基础伤害值（基础伤害+攻击力加成）
	var base_damage: float
	# 创建伤害实例
	if skill.skill_type == GameConstant.SKILL_TYPE.ATTACK:
		base_damage = base_attack
	else:
		base_damage = skill.get_final_damage(self)
	var damage = Damage.new(
		base_damage,
		skill.damage_type,
		self
	)

	# 对目标造成伤害
	if is_instance_valid(current_target):
		current_target.take_damage(skill, damage)
		
func take_damage(skill: Skill, damage: Damage):
	"""
	处理承受伤害的全流程
	参数:
		skill: 造成伤害的技能
		damage: 伤害实例
	"""
	# 根据伤害类型应用不同的减伤计算
	if damage.damage_type == GameConstant.DAMAGE_TYPE.PHYSICAL:
		# 物理伤害使用护甲减伤
		damage.base_value = _calculate_defense(damage.base_value)
	else:
		# 元素伤害使用抗性减伤
		damage.base_value = _apply_resistance(damage)
	
	# 扣除生命值
	hp -= damage.final_value
	
	# 创建并显示伤害数字
	var damage_number = preload("res://game/01_scenes/effect/damage_number.tscn").instantiate()
	damage_number.setup(damage.final_value, damage.critical)
	
	# 设置伤害数字显示位置（头顶上方）
	var pos = Vector2(0, -8)
	damage_number.position = pos
	add_child(damage_number)
	
func _apply_resistance(damage: Damage) -> float:
	"""
	应用元素抗性计算
	计算公式：最终伤害 = 原始伤害 * (100 / (抗性值 + 100))
	"""
	var resistance = resistances.get(damage.damage_type, 0.0)
	var mitigated_damage = damage.base_value * defense_percent_base / (resistance + defense_percent_base)
	return max(mitigated_damage, 1.0) # 确保最小伤害为1

func _calculate_defense(raw_damage: float) -> float:
	"""
	计算物理防御减伤
	使用护甲值进行计算
	"""
	return raw_damage * defense_percent_base / (defense_value + defense_percent_base)
#endregion

#region 效果应用系统
func _apply_effects(effect_type: String, damage: Damage, skill: Skill) -> float:
	"""
	统一应用装备和科技效果
	参数:
		effect_type: 效果类型
		damage: 伤害实例
		skill: 技能实例
	"""
	var value = damage.base_value
	value = _apply_equipment_effects(effect_type, value, skill)
	value = _apply_technology_effects(effect_type, value, skill)
	return value

func _apply_equipment_effects(effect_type: String, value: float, skill: Skill) -> float:
	"""
	应用装备效果修饰器
	遍历所有装备并应用其效果
	"""
	var modified = value
	return modified

func _apply_technology_effects(effect_type: String, value: float, skill: Skill) -> float:
	"""
	应用科技效果修饰器
	遍历所有科技并应用其效果
	"""
	var modified = value
	return modified
#endregion

#region 状态与事件
func is_alive() -> bool:
	"""检查单位是否存活"""
	return hp > 0

func _on_death():
	"""
	处理单位死亡事件
	- 将单位从场景中移除
	- 发送死亡信号
	"""
	queue_free()
	GlobalSignal.emit_signal("gs_unit_died", self)

func _on_damage_taken(damage: float, source: Unit):
	"""
	处理受到伤害事件
	发送单位受伤信号
	"""
	GlobalSignal.emit_signal("gs_unit_damaged", self, damage, source)
